//
// CATGL - Cheap Action-game Tool with WebGL.
//
// Copyright 2010, tmasda.
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
//     * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
//     * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following disclaimer
// in the documentation and/or other materials provided with the
// distribution.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

function MatrixStack(){}

MatrixStack.prototype = {
    // 初期化
    init: function(){
        this.array.length = 0;
    },
    // topのmatrixの参照
    top: function(){
        return this.array[this.array.length-1];
    },
    // push (一つ前のmatrixに掛ける)
    push: function(m){
        var newMatrix = new Float32Array(16);
        if (this.array.length > 0){
            //if (m instanceof Matrix){
            //    mat4.multiply(this.top(),m.flatten(), newMatrix);
            //} else {
            //    mat4.multiply(this.top(), m, newMatrix);
            //}
            mat4.multiply(this.top(), m, newMatrix);
        } else {
            newMatrix = m;
        }
        this.array.push(newMatrix); 
        return newMatrix;
    },
    // pop 
    pop: function(){
        if (this.array.length <= 0){
            throw "Invalid Matrix";
        }
        var m = this.array.pop();
        return m;
    }
}

MatrixStack.create = function(){
    var ms = new MatrixStack();
    ms.array = [];
    return ms;
}
